import {VueRequest} from 'xhyk-vue/xhTools/vueRequest.js'
import {ElLoading} from 'element-plus'

// region 配置API
import {AccountR} from './requestList/AccountR.js'
// endregion


export const myRequestR = new VueRequest()

// region 全局属性值
// 后端接口路径
export let myBaseUrl = {
  apiBase: ''
}
myBaseUrl.apiBase = window.$appsetting.baseUrl


// 设置域名根Url
myRequestR.baseUrl = myBaseUrl.apiBase
// 访问过期时间
myRequestR.timeOut = 20000
// 转换传参的data的字段值undefined和null的值为空文本
myRequestR.undefinedValue = ''
myRequestR.nullValue = ''

myRequestR.formData = false
// endregion


// region 请求后处理
// myRequestR请求的第三个参数more：
/*
* formData：是否已formData方式提交数据。有传参而且参数为false时，不以formData形式传。
* beforeR：开启请求前拦截。不传或传true时开启访问前拦截。
* afterR：开启请求后拦截。不传或传true时开启访问后拦截。推荐使用messageFun处理返回数据。
* beforeRFun：局部访问前拦截，优先级高于全局拦截函数，而且会使beforeR和全局拦截无效。
* afterRFun：局部访问后拦截，优先级高于全局拦截函数，而且会使afterR无效和全局拦截无效。
* baseUrl：局部重新定义了根Url。
* message：默认开启数据处理函数，false时全局和局部的处理函数都无效。
* messageFun：局部数据处理函数，优先级比全局messageFun要高,会使全局的无效。
* undefinedValue: 将传参的数据为undefined的值转为这个值。
* nullValue： 将传参的数据为null的值转为这个值。
* throttle：开启节流，默认为false
* */
// 全局的访问后-数据处理。
// 某个访问不需要处理时，在该访问函数中传more：{message：false}
// 某个访问需要处理但不想提示错误的消息时，传more:{messageError:false}
// 返回数据，拦截处理
myRequestR.messageFun = (data, more = {}) => {

  // region 暂停加载中
  if (more.Loading != undefined) {
    more.Loading.close && more.Loading.close();
    more.Loading = undefined
  }
  // endregion

  // region 被拦截
  if (data == undefined || data.code == -3) {
    console.log(data)
    return {status: false}
  }
  // endregion


  // region 上传阿里云文件时，没有返回值
  if (data.status == 200 && data.data == '') {
    return {status: true, message: '', data: undefined}
  }
  // endregion

  // 是否开启异常时弹窗
  const messageError = (more && more.messageError === false) ? false : true
  if (data.result) {
    const nowMsg = data?.data?.msg || '';

    // 后端数据返回正常，返回给接口
    if (data.data.status == 200) {
      return {status: true, data: data?.data?.data, message: nowMsg}
    } else {

      // region 过期处理
      if ((nowMsg.includes('过期') && nowMsg.includes('身份')) || nowMsg.includes("重新登录")) {
        setTimeout(() => {
          switch (window.$pinia.platform) {
            case "pc":
              window.$router.replace(var_route_list.login)
              break
            case "wx":
              window.$router.replace(var_route_list.wxLogin)
              break
            default:
              window.$router.replace(var_route_list.login)
              break;
          }
        }, 1000)
      }
      // endregion

      // 后端返回编号：非200
      if (messageError) {
        // 开启提示
        window.$message.error(`${nowMsg}；错误编号：${data?.data?.status}`)
      }
      return {status: false, message: nowMsg}
    }

  } else {
    // 访问后端出错。网络错误
    if (messageError) {
      window.$message.error(`${data.message}`)
    }
    return {status: false, message: data.message}
  }

}
// endregion


// region 请求前拦截。返回布尔型时，为false则拦截。或返回{}则拦截
// 全局的访问前拦截配置信息。不需要token的请求接口在more参数中传：{beforeR: false}
myRequestR.beforeRFun = async (config, more) => {

  // region 加载中
  if (more.noLoading != true) {
    more.Loading = ElLoading.service({
      lock: true,
      text: more.loadingText ? more.loadingText : '加载中...',
      background: 'rgba(0, 0, 0, 0.7)',
      target: document.body
    })
    setTimeout(() => {
      if (more.Loading) {
        more.Loading.close && more.Loading.close();
        more.Loading = undefined
      }
    }, myRequestR.timeOut + 5000)
  }
  // endregion


  // region 请求头处理

  // 机构id
  config.headers['Tenant-Id'] = window.$pinia.tenantId
  // 如果more里有，则用more里面的tenantId
  if (more.tenantId){
    config.headers['Tenant-Id'] = more.tenantId
  }


  // region 是否需要token
  if (more.noToken != true) {
    config.headers['Authorization'] = `${window.$pinia.xhykToken}`
  }
  // endregion


  if (more.headers) {
    for (let key in more.headers) {
      config.headers[key] = more.headers[key]
    }
  }

  return config
}
// endregion


// region 传myRequestR对象给组织结构，下面如同
// 后端项目文件夹
let secodeUrl = ''
// 自动导入的对象
export const accountR = new AccountR(myRequestR, secodeUrl)
// endregion

